C语言高手进 快`!!!!

来源:百度知道 编辑:UC知道 时间:2024/07/05 06:52:50
我问几个题目铪``要帮我详细解答下喔``

1.若有说明:int *p,m=5,n; 下面正确的程序段是( )

A) P=&n ;sanf("%d",&p);
B) P=&n ;sanf("%d",*p);
C)sanf("%d",&n);*p=n ;
D)P=&n ;*p=m;

2.以下叙述正确的是`
A) 预处理命令行必须位于C源程序的起始位置

B) 在C语言中 预处理命令行都以#开头

C) 每个C程序 必须在开头包含预处理命令行:#include<stdio.h>

D) C语言的预处理不能实现宏定义和条件编译的功能`

参考答案选D 但我认为一定错``请高手们指点下我喔`到底选啥`?

3>下面程序的运行结果是

#define MIN(x,y) (x<y)?(x):(y)
main ()
{int i=10;j=15;k;
k=10*MIN(i,j);
printf("%d\n",k);}

答案是15 ``知道为什么的请 教下我`谢谢`!

最后一题^_^``
struct aa
{int r1;double r2;float r3;
union uu{char u1[5]; long u2[2];}ua;
}mya;

那么sizeof(struct aa)的值是``( )

不会做``身边也貌似米人会`

帮帮我`我会追加喔 ^_^``

1.选D
A中,P本来就是指向n的地址了,没有必要在scanf()中再取地址了。
B中,P本来就是指向n的地址了,如果在scanf()中用解引用,就无法得到n的地址了。
C中,没有为p分配空间,所以对p指向的地址写入数据是危险的。

2.选B
其它的都是错误的。

3.正确答案是10而不是15
k=10*MIN(i,j);
经过MIN宏展开后,这个语句就变成了:
k=10*(10<15)?(10):(15);
由于*的优先级大于条件操作符,所以这个语句就等价于:
k=(10*(10<15))?(10):(15);
因为10<15是成立的,所以(10<15)是个非0值,这个非0值乘以10之后依然是个非0值,所以k的值就是10

最后一题,这个结果与机器有关,以32位平台为例:
int,float这两个类型都是占用4字节。
double占用8字节,所以r1,r2,r3三个变量共占用16字节。
在共用体中以占用字节最多的变量所占用的字节为准,所以,char类型占用1字节,u1有5个char元素,所以占用5字节,long占用4字节,u2有2个long元素,所以占用8字节。所以共用体uu就占用8字节,所以这个结构体总共的大小是24字节,但是由于存在字节对齐,所以就要看所用C系统的默认对齐值是几字节。

1.
scanf后面跟的是数组写入的地址,所以:
A-错,p已经是n的地址了
B-错,*p就是n了,不再是地址
C-错,p没有正确赋值,不能进行取值赋值操作
D-对
2.
A-错,文件的任意有效位置(从头到尾)
B-对
C-错,没用到stdio.h头文件的函数时就不需要用到
D-错,可以实现
3.
10
k=10*MIN(i,j);
展开后为:
k=10*(i<j) ? i : j; //展开后,10*被用于条件中
k=i; // 即k=10
4